from typing import List, Union, Any, Dict, Optional
from fastapi import FastAPI, Query, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from pydantic import BaseModel
import uvicorn

import os
import time
from loguru import logger
from threading import Thread

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_path = os.path.join(BASE_DIR, 'logs/keywords_retrieval_by_emb.log')
logger.add(log_path, rotation="5MB", encoding="utf-8", enqueue=True)

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    # 允许跨域的源列表，例如 ["http://www.example.org"] 等等，["*"] 表示允许任何源
    allow_origins=["*"],
    # 跨域请求是否支持 cookie，默认是 False，如果为 True，allow_origins 必须为具体的源，不可以是 ["*"]
    allow_credentials=False,
    # 允许跨域请求的 HTTP 方法列表，默认是 ["GET"]
    allow_methods=["*"],
    # 允许跨域请求的 HTTP 请求头列表，默认是 []，可以使用 ["*"] 表示允许所有的请求头
    # 当然 Accept、Accept-Language、Content-Language 以及 Content-Type 总之被允许的
    allow_headers=["*"],
    # 可以被浏览器访问的响应头, 默认是 []，一般很少指定
    # expose_headers=["*"]
    # 设定浏览器缓存 CORS 响应的最长时间，单位是秒。默认为 600，一般也很少指定
    # max_age=1000
)


class Item(BaseModel):
    user_key_word: str = Query('编号'
                               # , min_length=0
                               # , max_length=128
                               )
    search_num: int = 100


class effective_return(BaseModel):
    name: str
    description: str


class Retrun_schema(BaseModel):
    code: int
    data: Optional[List[effective_return]] = None
    timestamp: str
    message: Optional[str] = None

def update_index():
    global key_word_obj
    while True:
        # 每隔一段时间检查一次数据是否更新
        time.sleep(60)  # 假设每隔 1 分钟检查一次

        # 获取当前时间
        current_cnt = key_word_obj.get_key_word_count_in_mysql()
        logger.debug(f"执行数据库检查，当前表格数据条数：{current_cnt}")

        # 如果数据更新了，则重新加载数据并构建索引
        if current_cnt != key_word_obj.last_data_cnt:
            logger.info("Data has been updated. Rebuilding index...")
            key_word_obj.key_words_list = key_word_obj.get_key_words_list(db='mysql')
            key_word_obj.key_words_vector_db = key_word_obj.build_vectorstore()
            key_word_obj.last_data_cnt = current_cnt


# 启动一个线程用于定时检查数据更新并重建索引
thread = Thread(target=update_index)
thread.start()


@app.post("/similarity_key_words", response_model=Retrun_schema)
async def search_similarity_key_words(item: Item):
    logger.debug(f"用户查询：{item.user_key_word} , 查询个数：{item.search_num}")
    """ 实现具体逻辑"""
    return {
        'code': 200,
        'data': '',
        'timestamp': ''
    }


if __name__ == '__main__':
    uvicorn.run(app='fastapi_app:app', host='0.0.0.0', port=8090)
